package analiseSintatica.Regras.Funcao;

import java.util.LinkedList;

import AnaliseLexicaFinal.EstruturaDeDados.LinkToken;
import analiseSintatica.ErroSintaticoException;
import analiseSintatica.Regras.Regra;
import analiseSintatica.estruturadados.NoArvore;

public class RegraChamadaFuncao extends Regra {


        
    //<chamada_funcao> := identificador "(" [<args_chamada>] ")"
    
    protected static Regra instancia;
    protected String estrutura = "identificador '(' [<args_chamada>] ')'";

    
    /**
     * Construtor privado necessario ao singleton
     */
    private RegraChamadaFuncao() {
    }

    /**
     * Retorna a unica instancia dessa classe.
     * @return
     */
    public static RegraChamadaFuncao getInstance() {
        if (instancia == null) {
            instancia = new RegraChamadaFuncao();
        }
        return (RegraChamadaFuncao) instancia;
    }
    

    @Override
    public NoArvore analisar(LinkedList<LinkToken> listaTokens) throws ErroSintaticoException {
        
        ErroSintaticoException erros = new ErroSintaticoException();
        
        NoArvore NaoTerminalChamadaFuncao = new NoArvore("<chamada_funcao>", false);
        
        try{
            NaoTerminalChamadaFuncao.adicionaFilho(reconheceToken(listaTokens, "identificador",estrutura));
        }catch(ErroSintaticoException e){
            
        }
        
        try{
            NaoTerminalChamadaFuncao.adicionaFilho(reconheceLexema(listaTokens, "delimitador", "(",estrutura));
        }
        catch(ErroSintaticoException e){
            
        }
        
        try{
            if(RegraArgsChamada.getInstance().getPrimeiro().contains(listaTokens.getFirst().getLexema())){
                NaoTerminalChamadaFuncao.adicionaFilho(RegraArgsChamada.getInstance().analisar(listaTokens));
            }
        }catch(ErroSintaticoException e){
            
        }
            
        
            
        try{
            NaoTerminalChamadaFuncao.adicionaFilho(reconheceLexema(listaTokens, "delimitador", "}",estrutura));
        }catch(ErroSintaticoException e){
                   
        }          
        
        

        return NaoTerminalChamadaFuncao;
    }

    @Override
    protected void setPrimeiro() {
        this.primeiro.add("identificador");

        //throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    protected void setSeguinte() {
        this.seguinte.add(";");
        
        //throw new UnsupportedOperationException("Not supported yet.");
    }
}
